package com.usian.controller;

import com.usian.feign.CarServerFeign;
import com.usian.feign.TbItemFeign;
import com.usian.pojo.TbItem;
import com.usian.utils.CookieUtils;
import com.usian.utils.JsonUtils;
import com.usian.utils.Result;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

/**
 * @author chen
 * @date 2021/1/26 - 17:42 - 星期二
 * @project usian_parent
 * @package com.usian.controller
 * @by GGbomd猪猪侠
 */
@RestController
@RequestMapping("/frontend/cart")
public class CartControllerWeb {

    // 保存在cookie中的key值
    @Value("${CART_COOKIE_KEY}")
    private String CART_COOKIE_KEY;

    //保存在cookie中的时间
    @Value("${CART_COOKIE_EXPIRE}")
    private Integer CART_COOKIE_EXPIRE;

    @Autowired
    private TbItemFeign tbItemFeign;

    @Autowired
    private CarServerFeign carServerFeign;

    /**
     * 不登陆的情况下将商品添加到购物车
     * @param userId 用户id
     * @param itemId 商品详情id
     * @param num 默认购物车商品数量是1
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/addItem")
    public Result addItem(String userId, Long itemId,
                          @RequestParam(defaultValue = "1") Integer num,
                          HttpServletRequest request, HttpServletResponse response){
        try {
            // StringUtils.isBlank 判空 看有没有登录的id有返回true  没有返回false
            if(StringUtils.isBlank(userId)){
                /***********在用户未登录的状态下**********/
                // 1、从cookie中查询商品列表。
                Map<String, TbItem> map = getCartFromCookie(request);
                // 2 、添加商品到购物车
                addItemToCart(map,itemId,num);
                //3、把购物车列表写入到cookie中
                addClientCookie(request,response,map);
            }else {
                // 用户在登录的状态下
                // 从redis中查询商品列表
                Map<String,TbItem> cart = getCartFromRedis(userId);
                // 将商品添加到购物车中
                addItemToCart(cart,itemId,num);
                // 将购物车中的商品放到redis缓存中
                Boolean addCartToRedis = addCartToRedis(userId,cart);
                if (addCartToRedis){
                    return Result.ok();
                }
                return Result.error("error");
            }
            return Result.ok();
        }catch (Exception e){
            e.printStackTrace();
            return Result.error("error");
        }
    }

    /**
     * 查看购物车
     * @param userId
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/showCart")
    public Result showCart(String userId,HttpServletRequest request,HttpServletResponse response){
        try {
            // 用户在为登录的情况下
            List<TbItem> tbItemList = new ArrayList<>();
            if (StringUtils.isBlank(userId)){
                // 获取存在cookie中的key值
                String cookieValue = CookieUtils.getCookieValue(request, CART_COOKIE_KEY, true);
                Map<String,TbItem> map = JsonUtils.jsonToMap(cookieValue, TbItem.class);
                // 把ket放到set集合中 在便利取到value值
                Set<String> keys = map.keySet();
                for (String key : keys) {
                    // 得到key获取value值
                    tbItemList.add(map.get(key));
                }
            }else {
                // 登录
                Map<String, TbItem> cartFromRedis = getCartFromRedis(userId);
                if (cartFromRedis == null || cartFromRedis.size() == 0){
                    return Result.error("查询失败");
                }
                Set<String> keySet = cartFromRedis.keySet();
                for (String s : keySet) {
                    tbItemList.add(cartFromRedis.get(s));
                }
            }
            return Result.ok(tbItemList);
        }catch (Exception e){
            e.printStackTrace();
            return Result.error("error");
        }
    }

    /**
     * 修改cookie中的购物车
     * @param num 修改的数量
     * @param userId 登录人员的id
     * @param itemId 商品信息的id
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/updateItemNum")
    public Result updateItemNum(Integer num,String userId,Long itemId,HttpServletRequest request,HttpServletResponse response){
        try {
            // StringUtils.isBlank判空 时空的话返回true 不是的虎牙返回false
            if (StringUtils.isBlank(userId)){
                // 未登录
                //1.获得cookie中的购物车
                Map<String, TbItem> cartFromCookie = getCartFromCookie(request);
                //2.修改购物车中商品的数量
                TbItem tbItem = cartFromCookie.get(itemId.toString());
                tbItem.setNum(tbItem.getNum()+num);
                cartFromCookie.put(itemId.toString(),tbItem);
                //3.把修改后的购物车在放回到cookie中
                addClientCookie(request,response,cartFromCookie);
            }else {
                //登录
                // 获取redis中购物车中的信息
                Map<String, TbItem> cartFromRedis = getCartFromRedis(userId);
                // 修改购物车中的商品
                TbItem tbItem = cartFromRedis.get(itemId.toString());
                tbItem.setNum(num);
                cartFromRedis.put(itemId.toString(),tbItem);
                // 在把购物车添加到redis中
                addCartToRedis(userId,cartFromRedis);
            }
            return Result.ok();
        }catch (Exception e){
            e.printStackTrace();
            return Result.error("修改失败");
        }
    }

    /**
     * 删除cookie中购物车的信息
     * @param itemId
     * @param userId
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/deleteItemFromCart")
    public Result deleteItemFromCart(Long itemId,String userId,HttpServletRequest request,HttpServletResponse response){
        try {
            if (StringUtils.isBlank(userId)){
                // 未登录
                // 获取cookie中的购物车
                Map<String, TbItem> cartFromCookie = getCartFromCookie(request);
                // 通过商品的id删除
                cartFromCookie.remove(itemId.toString());
                // 删除完在放回到cookie中qu
                addClientCookie(request,response,cartFromCookie);
            }else {
                //已经登陆
                //1、获得redis中的购物车
                Map<String, TbItem> cart = getCartFromRedis(userId);

                //2、删除购物车中的商品
                cart.remove(itemId.toString());

                //3、把购物车写到redis中
                addCartToRedis(userId,cart);
            }
            return Result.ok();
        }catch (Exception e){
            e.printStackTrace();
            return Result.error("删除失败");
        }
    }

    /**
     * 把购车商品列表写入redis
     * @param userId
     * @param cart
     */
    private Boolean addCartToRedis(String userId, Map<String, TbItem> cart) {
        return carServerFeign.insertCart(userId, cart);
    }


    /**
     * 从redis中查询购物车
     * @param userId
     * @return
     */
    private Map<String, TbItem> getCartFromRedis(String userId) {
        Map<String,TbItem> cart = carServerFeign.selectCartByUserId(userId);
        if(cart!=null && cart.size()>0){
            return cart;
        }
        return new HashMap<String,TbItem>();
    }

    /**
     * 把购物车商品列表写入cookie
     * @param request
     * @param response
     * @param map
     */
    private void addClientCookie(HttpServletRequest request, HttpServletResponse response, Map<String, TbItem> map) {
        String cartJson = JsonUtils.objectToJson(map);
        CookieUtils.setCookie(request,response,CART_COOKIE_KEY,cartJson,CART_COOKIE_EXPIRE,true);
    }

    /**
     * 添加商品到购物车
     * @param map
     * @param itemId
     * @param num
     */
    private void addItemToCart(Map<String, TbItem> map, Long itemId, Integer num) {
        //从购物车中取商品
        TbItem tbItem = map.get(itemId);
        if (tbItem != null){
            // 商品列表中存在该商品 商品数量加1
            tbItem.setNum(tbItem.getNum()+num);
        }else {
            // 商品列表中不存在该商品 根据商品id查询商品信息并添加到购物车列表
            tbItem = tbItemFeign.selectItemInfo(itemId);
            tbItem.setNum(num);
        }
        map.put(itemId.toString(),tbItem);
    }

    /**
     * 获取购物车
     * @param request
     * @return
     */
    private Map<String, TbItem> getCartFromCookie(HttpServletRequest request) {
        String cookieValue = CookieUtils.getCookieValue(request, CART_COOKIE_KEY, true);
        //判断参数是否不为空.
        if (StringUtils.isNotBlank(cookieValue)){
            // 购物车已存在
            Map<String,TbItem> map = JsonUtils.jsonToMap(cookieValue, TbItem.class);
            return map;
        }
        // 购物车不存在
        return new HashMap<>();
    }

}
